اسمبلی 1
حافظه و آدرس دهی
هر کامپیوتر مبتنی بر8086 دارای حداقل640 کیلوبایت حافظه است . این 640 کیلوبایت به قطعات 64 کیلوبایتی تقسیم شده و ما این قطعات را "قطعه " یا Segment مینامیم . هر سگمنت هم به خانه های تک بایتی دیگری تقسیم شده است.
برای بدست آوردن مقدار یک بایت مشخص از حافظه ما باید عدد مربوط به سگمنت وهمچنین شماره آن بایت در سگمنت ( که آفست نامیده میشود) را بدانیم . Offset یعنی یک آدرس در مبنای 16 که 16 بیتی است و( یا در حالت win32 یک عدد 32 بیتی می باشد. ) و مثلا اگر مقدار مورد نظر در قطعه 0030h باشد و افست آن 13C4h باشد ما باید قطعه ای که شماره آن 0030h است را بیابیم و بعد در همان قطعه افست 134C را بدست آوریم .
برای نمایش این حالت بین عدد سگمنت و آفست علامت ( : ) قرار میدهیم . یعنی
0030:134C در حالت داس و 0030:0000134C در حالت ویندوز. Segment:Offset
** همیشه در آدرس دهی ها از اعداد مبنای 16 استفاده میکنم .
Registers ثباتها
رجیسترها مکان هائی ازCPU هستند که برای نگهداری داده ها (DATA) و کنترل اجرای برنامه بکار میروند . ما میتوانیم آنها را مقدار دهی کرده و یا بخوانیم و یا باتغییر محتوای آنهاCPU را مجبور به انجام یک پروسه (رویه یاProcedure ) کنیم .
دسته ای از رجیسترها که ما آنها را "ثباتهای همه کاره یا همه منظوره " میخوانیم و شامل ax,bx,cd,dx هستند در حالت داس ( حالت 2 بایتی ) ودر حالت ویندوز eax,ebx,ecx,edx ( بصورت 4 بایتی) ، برای انتقال مقادیر بین رجیستر ها وCPU بکار میروند.
در حالت ویندوز ثباتهای معروف دیگر( که هر کدام قانون خاصی دارد ) عبارتند از :
EIP
این ثبات مقدار شماره خط در حال اجرا نمایش می دهد.
ESP
قبل از توضیح این ثبات باید در باره پشته صحبت کنیم . پشته یا Stack (نمیدونم درست نوشتمش یا نه ) محلی است که برنامه مقادیر ذخیره شده ثباتهای دیگر را در آن قرار می دهد . قانونی پشته در این است که هر چیز که اول وارد آن گردد آخر سر خارج می شود.The 1st input is the last one come out
خوب معلوم است که این ثبات شماره پشته را در خود نگه می دارد.
برای روشن تر شدن قضیه و چگونه استفاده از پشته یه مثال میزنم . فرض کنیم یک MsgBox باید نمایش داده شود .
در این حالت مکان یا آدرس جایی که رشته مورد نمایش در حاقظه قرار دارد در ثباتی مثل Eax قرار داده می شود یعنی
1- Mov eax,00450F1C eax آدرس رشته مورد نظر در خودش قرار میده
حالا این ادرس ذخیره میشه :
2-Push eax در پشته قرار دادن این آدرس
متغیر رو صفر میکنه :
Xor eax,eax صفر کردن متغیر یا ثبات برای فرا خوانی تابع
صدا زدن تابع :
[jmp dword ptr [004121F0
برنامه به محلی که رویه Messageboxa توسط برنامه مورد مثال فرا خوانی می شود ارسال می گردد.
( دستوارت بعدا توضیح داده می شود).
همانطور که دیده میشه برای انتقال متغیر به تابع سه راه حل وجود داره
استفاده از ثباتها ویا ترکیبی از اونها
استفاده از پشته
استفاده هم از پشته هم از ثباتها
توی مثال بالا هم از از پشته هم از eax استفاده شد
ثبات( EDI (Data Index
این ثبات برای نگه داری اطلاعات مورد نظر برنامه استفاده می شود. تقریبا مثل ثبات همه کاره
ثبات(ESI(Segment Index
همانند EDI
ثباتهای همه منظوره به دو نیم ثبات تک بایتی تقسیم میشوند . بایت بالائی با نمادH و بایت پائینی با نمادL نشان داده میشود . مثلا ثبات AX دارای دو نیم- ثبات AH,AL است .
در داس:
اگر AX را بصورت ABCD نمایش دهیم CD درAl و AB درAh قرار می گیرد حال اگر مقدار 1234h (h نمایینده قرار گرفتن در مد Hex می باشد) درAX قرار داده شود ( هنگامی که از حافظه برنامه مقدار دهی شود .) مقدار 12 درAl و مقدار 34 درAh قرار می گیرد.(Eax=3412)
در حالت ویندوز
این حالت بر قرار است اماEax=XXXXABCD
AB معرف Ah وCD معرف Al می باشد.